/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Objetos.Usuario;
import Objetos.Funcionario;
import DAO.AccessDatabase;
import java.awt.HeadlessException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author celiobj
 */
public class RepositorioFuncionario implements RepositorioFuncionarioInterface {

    @Override
    public void inserirFuncionario(Funcionario funcionario, Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `funcionarios` (`nomefuncionario`, `numerocadastrofuncionario`, `telefonefuncionario`,`tipofuncionario`,`data_inclusaofuncionario`) VALUES ('" + funcionario.getNome() + "', '" + funcionario.getNumeroCadastro() + "','" + funcionario.getTelefone() + "','" + funcionario.getTipo() + "' ,'" + funcionario.getData_inclusao() + "');");

            JOptionPane.showMessageDialog(null, "Funcionário inserido com sucesso!!!");

        } catch (SQLException ex) {
            Logger.getLogger(RepositorioUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public void alterarFuncionario(Funcionario antes, Funcionario depois,Usuario usu) {
    
         try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.executeUpdate("UPDATE funcionarios SET nomefuncionario='" + depois.getNome() + "',numerocadastrofuncionario='" + depois.getNumeroCadastro()+ "',telefonefuncionario='" + depois.getTelefone() + "',tipofuncionario='"+ depois.getTipo()+ "' WHERE idfuncionario = '" + antes.getCod_funcionario() + "'");
            con.close();

            JOptionPane.showMessageDialog(null, "Funcionario alterado com sucesso!!!");
            
        } catch (SQLException | HeadlessException t) {
            System.out.println(t.getMessage());

        }
        
    }

    @Override
    public Funcionario procurarFuncionario(String cod_funcionario,Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT nomefuncionario,numerocadastrofuncionario,telefonefuncionario,tipofuncionario FROM `funcionarios` WHERE idfuncionario = " + cod_funcionario + "");
            rs.next();
            Funcionario func = new Funcionario();
            func.setCod_funcionario(cod_funcionario);
            func.setNome(rs.getString("nomefuncionario"));
            func.setNumeroCadastro(rs.getString("numerocadastrofuncionario"));
            func.setTelefone(rs.getString("telefonefuncionario"));
            func.setTipo(rs.getString("tipofuncionario"));
            con.close();
            return func;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public JTable listarTodos(Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `funcionarios`");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("Código");
            cabecalho.addElement("Nome");
            cabecalho.addElement("CPF");
            cabecalho.addElement("Telefone");
            cabecalho.addElement("Função");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(250);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(30);
            tabela.getColumnModel().getColumn(4).setPreferredWidth(30);

            con.close();
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        Vector LinhaAtual = new Vector();

        try {
            for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                switch (rsmd.getColumnType(i)) {
                    case Types.VARCHAR:
                        LinhaAtual.addElement(rs.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        LinhaAtual.addElement(rs.getDate(i).toLocaleString().substring(0, 10));
                        break;
                    case Types.INTEGER:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.DECIMAL:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DOUBLE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;

                }
            }
        } catch (SQLException e) {
        }
        return LinhaAtual;

    }

    @Override
    public Vector<String> ArraydeFuncionarios(Usuario usu) {

        Vector<String> retorno = new Vector<>();
        retorno.addElement(" ");
        AccessDatabase a = new AccessDatabase();
        Connection con = a.conectar();
        Statement st;
        try {
            st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `funcionarios`");

            while (rs.next()) {
                Funcionario fun = new Funcionario();
                fun.setCod_funcionario(rs.getString("idfuncionario"));
                fun.setNome(rs.getString("nomefuncionario"));
                retorno.add(fun.getCod_funcionario());

            }

        } catch (SQLException ex) {
            Logger.getLogger(RepositorioFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }

        return retorno;

    }

    @Override
    public Funcionario procurarPeloNome(String nome,Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `funcionarios` WHERE nomefuncionario = " + nome + "");
            rs.next();
            Funcionario func = new Funcionario();
            func.setCod_funcionario(rs.getString("idfuncionario"));
            func.setNome(rs.getString("nomefuncionario"));
            func.setNumeroCadastro(rs.getString("numerocadastrofuncionario"));
            func.setTelefone(rs.getString("telefonefuncionario"));
            func.setTipo(rs.getString("tipofuncionario"));
            con.close();
            return func;

        } catch (Exception t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

}
